
/* ========================================
 * Empty fields validate
 * ========================================
 */

function js_validate_text_empty(obj) {
	/* Size and maxLength must be equal for non formatted text fields */
	if( obj.type == "text" ) {
		if( (obj.value == "" || obj.value == null) || (obj.maxLength < 25 && obj.value.length < obj.maxLength) ) { 
			obj.style.backgroundColor = "#FFCCCC";
		} else {
			obj.style.backgroundColor = "";
		}
	}
}

/**
 * Check if the object is an empty field
 * @param obj
 * @returns (Boolean) true if its empty or false otherwise
 */
function js_validate_is_empty(obj) {
	if( obj.type == "text" ) {
		if( (obj.value == "" || obj.value == null) || (obj.maxLength < 25 && obj.value.length < obj.maxLength) ) { 
			return true;
		} else {
			return false;
		}
	}
	
	return false;
}

var g_created_required_arr = false;
var g_required_arr;
var g_submit_btt;

/**
 * Set the global vars with the submit button and the array with the required objects
 * @param elem_array
 * @returns an array with the required objects, false otherwise
 */
function js_create_required_arr( elem_array ) {
	var required_arr = Array();
	var submit_btt;
	
	/* verify if the element is empty by checking its onblur mask function */
	for(i=0; i<elem_array.length; i++) { var elem = elem_array[i];
	
		if( elem.type == "submit" ) { //get the form submit button
			submit_btt = elem;
		}
		
		if(elem.onblur != "function onblur(event) {\n}" && elem.onblur != null) { //should improve this
			required_arr.push(elem);
		}
	}
	
	if( required_arr.length < 1 || submit_btt == null ) {
		return false;
		
	} else {
		g_created_required_arr = true;
		g_required_arr = required_arr;
		g_submit_btt = submit_btt;
		
		return true;
	}
}

/**
 * Validates all empty input fields on document
 * @param sub_btt_id
 */
function js_validate_all_empty( form ) {	
	var elem_array = form.getElementsByTagName("INPUT");
	var last_was_empty = false;
	var has_empty = true;

	/* Check if global var was already set */
	if(!g_created_required_arr) { 
		js_create_required_arr(elem_array); 
	}
	/* Check if required array was created above */
	if( g_required_arr != false ) {
		
		/* Verify if there is any empty field */
		for(i=0; i<g_required_arr.length; i++) { var elem = g_required_arr[i];
		
			if( elem.type == "text" ) { //text fields
				has_empty = js_validate_is_empty(elem);
				if( has_empty ) break;

			} else {
				has_empty = false;
			}
		}
		/* Check if forms submit button was founded */
		if( g_submit_btt != null ) {
			/* If there is no empty field the submit button is enabled */
			if( has_empty == true ) 	{ g_submit_btt.disabled = true; }
			else 						{ g_submit_btt.disabled = false; }
			
		} else
			alert('Javascript ERRO: No submit button found.');
	} else
		alert('Javascript ERRO: Required array not created properly.');
}

/* ========================================
 * Regex masks
 * ========================================
 */
//ref.: http://elcio.com.br/ajax/mascara/ 

function js_mask(o,f){
	o.style.backgroundColor = "";
	
    v_obj = o;
    v_fun = f;
    setTimeout("execMask()",1);
}

function execMask(){
    v_obj.value = v_fun(v_obj.value);
}

//function maskLeech(v){
//    v=v.replace(/o/gi,"0");
//    v=v.replace(/i/gi,"1");
//    v=v.replace(/z/gi,"2");
//    v=v.replace(/e/gi,"3");
//    v=v.replace(/a/gi,"4");
//    v=v.replace(/s/gi,"5");
//    v=v.replace(/t/gi,"7");
//    return v;
//}

/* Email mask */
function maskEmail(v){
    v=v.replace(/[^A-Za-z0-9.-_]/g,""); //Remove tudo que nao e letra maiuscula ou espaco em branco
    v=v.toLowerCase();
    
    return v;
}

/* Some punctuation mask */
function maskPunct(v){
    v=v.replace(/[^A-Za-z0-9.ºª& ]/g,""); //Remove tudo que nao e letra maiuscula ou espaco em branco
//    v=v.toUpperCase();
    return v;
}

/* Only letters allowed */
function maskJustLetters(v){
    v=v.replace(/[^A-Za-z ]/g,""); //Remove tudo que nao e letra maiuscula ou espaco em branco
//    v=v.toUpperCase();
    return v;
}

/* Only numbers allowed */
function maskJustNumbers(v){
    return v.replace(/\D/g,"");
}

/* Mask a time with hour and minutes */
function maskTime(v){
    v=v.replace(/\D/g,"");                  //Remove tudo o que não é dígito
    v=v.replace(/^(\d{2})(\d{2})/,"$1:$2"); //Esse é tão fácil que não merece explicações
    return v;
}

function maskTelephone(v){
    v=v.replace(/\D/g,"");                 //Remove tudo o que não é dígito
    v=v.replace(/^(\d\d)(\d)/g,"($1) $2"); //Coloca parênteses em volta dos dois primeiros dígitos
    v=v.replace(/(\d{4})(\d)/,"$1-$2");    //Coloca hífen entre o quarto e o quinto dígitos
    return v;
}

/* For values cpf type */
function maskCpf(v){
    v=v.replace(/\D/g,"");                    //Remove tudo o que não é dígito
    v=v.replace(/(\d{3})(\d)/,"$1.$2");       //Coloca um ponto entre o terceiro e o quarto dígitos
    v=v.replace(/(\d{3})(\d)/,"$1.$2");       //Coloca um ponto entre o terceiro e o quarto dígitos
                                             //de novo (para o segundo bloco de números)
    v=v.replace(/(\d{3})(\d{1,2})$/,"$1-$2"); //Coloca um hífen entre o terceiro e o quarto dígitos
    return v;
}

function maskCep(v){
    v=v.replace(/\D/g,"");                //Remove tudo o que não é dígito
    v=v.replace(/^(\d{5})(\d)/,"$1-$2"); //Esse é tão fácil que não merece explicações
    return v;
}

//function maskCnpj(v){
//    v=v.replace(/\D/g,"");                           //Remove tudo o que não é dígito
//    v=v.replace(/^(\d{2})(\d)/,"$1.$2");             //Coloca ponto entre o segundo e o terceiro dígitos
//    v=v.replace(/^(\d{2})\.(\d{3})(\d)/,"$1.$2.$3"); //Coloca ponto entre o quinto e o sexto dígitos
//    v=v.replace(/\.(\d{3})(\d)/,".$1/$2");           //Coloca uma barra entre o oitavo e o nono dígitos
//    v=v.replace(/(\d{4})(\d)/,"$1-$2");              //Coloca um hífen depois do bloco de quatro dígitos
//    return v;
//}

//function maskRomans(v){ //Chamda onkeyup
//    v=v.toUpperCase();             //Maiúsculas
//    v=v.replace(/[^IVXLCDM]/g,""); //Remove tudo o que não for I, V, X, L, C, D ou M
//    //Essa é complicada! Copiei daqui: http://www.diveintopython.org/refactoring/refactoring.html
//    while(v.replace(/^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/,"")!="");
//        v=v.replace(/.$/,"");
//    return v;
//}

function maskSite(v){
    //Esse sem comentarios para que você entenda sozinho ;-)
    v=v.replace(/^http:\/\/?/,"");
    dominio=v;
    caminho="";
    if(v.indexOf("/")>-1);
        dominio=v.split("/")[0];
        caminho=v.replace(/[^\/]*/,"");
    dominio=dominio.replace(/[^\w\.\+-:@]/g,"");
    caminho=caminho.replace(/[^\w\d\+-@:\?&=%\(\)\.]/g,"");
    caminho=caminho.replace(/([\?&])=/,"$1");
    if(caminho!="")dominio=dominio.replace(/\.+$/,"");
    v="http://"+dominio+caminho;
    return v;
}

function maskBirthDate(v) {
	v=v.replace(/\D/g,"");
	v=v.replace(/(^[4-9])/,"");		//For just 31x days
	v=v.replace(/(^3[2-9])/,"3");	//...
	v=v.replace(/^(\d{2})([2-9])/,"$1");		//For just 12 moths
	v=v.replace(/^(\d{2})(1[3-9])/,"$1-1");		//...
	v=v.replace(/^(\d{2})(\d{2})([0]|[3-9])/,"$1-$2");		//From 1900 till 2000
	v=v.replace(/^(\d{2})(\d{2})(1[0-8])/,"$1-$2-1");		//... For 19xx
	v=v.replace(/^(\d{2})(\d{2})(2[1-9])/,"$1-$2-2");		//... For 2000
	v=v.replace(/^(\d{2})(\d{2})(20[1-9])/,"$1-$2-20");		//...
	v=v.replace(/^(\d{2})(\d{2})(200[1-9])/,"$1-$2-200");	//...
	v=v.replace(/^(\d{2})(\d{2})(\d)/,"$1-$2-$3");		
	return v;
}

/* For money values for 4 digits*/
function validateMoney(v) {
	v=v.replace(/^(\d+),(\d{2})(\d+)$/,"$1,$2");
	v=v.replace(/^(\d+),$/,"$1");
	
	if( v.indexOf(",") > 3 ) { //v.length > 3
		v=v.replace(/(\d+)(\d{3},\d{2})$/g,"$1.$2"); //Coloca o primeiro ponto
		v=v.replace(/(\d+)(\d{3})$/g,"$1.$2,00"); //Coloca o primeiro ponto
		var qtdLoop = (v.length-3)/3;
		var count = 0;
		while (qtdLoop > count)
		{
			count++;
			v=v.replace(/(\d+)(\d{3}.*)/,"$1.$2"); //Coloca o resto dos pontos
		}

	} else {
		v=v.replace(/^(\d+),(\d)$/,"$1,$20"); //Coloca o resto dos pontos
		v=v.replace(/^(\d+)$/,"$1,00"); //Coloca o resto dos pontos
	} 
	
	if(v=="") v="0,00";
	else v=v.replace(/^,(\w+)/,"$1");
	
	v=v.replace(/^(0+)(\d)/g,"$2"); //remove "0″ à esquerda

	return v;
}

function maskMoney(v) {
	v=v.replace(/^,/,""); // Remove caso comece com virgula
	v=v.replace(/^(\d+),(\d{2})(\d+)/,"$1,$2"); //Somente duas casas decimais
	v=v.replace(/[^\d,]/g,""); // Remove tudo que não é dígito ou vírgula
	v=v.replace(/(\d{4})(\d+)/,"$1"); //Numero de 4 digitos antes da virgula
	v=v.replace(/^0+/g,"");  // Remove zeros à esquerda
	
	return v;
}

/* For negative money values for 4 digits */
function validateMoneyNeg(v) {
	var neg = v.indexOf("-");
	if(neg == null || neg == -1) {
		return validateMoney(v);
		
	} else if( neg == 0) {
		v=v.replace(/^-(\d+),(\d{2})(\d+)$/,"-$1,$2");
		v=v.replace(/^-(\d+),$/,"-$1");
		
		if( v.indexOf(",") > 4 ) { //If has comma just use the lengh of number before it
			v=v.replace(/-(\d+)(\d{3},\d{2})$/g,"-$1.$2"); //Coloca o primeiro ponto
			v=v.replace(/-(\d+)(\d{3})$/g,"-$1.$2,00"); //Coloca o primeiro ponto
			var qtdLoop = (v.length-4)/4;
			var count = 0;
			while (qtdLoop > count)
			{
				count++;
				v=v.replace(/-(\d+)(\d{3}.*)/,"-$1.$2"); //Coloca o resto dos pontos
			}

		} else {
			v=v.replace(/^-(\d+),(\d)$/,"-$1,$20"); //Coloca o resto dos pontos
			v=v.replace(/^-(\d+)$/,"-$1,00"); //Coloca o resto dos pontos
		} 
		
		if(v=="") v="0,00";
		else v=v.replace(/^,(\w+)/,"$1");

		v=v.replace(/^-(0+)(\d)/g,"-$2"); //remove "0″ à esquerda

		return v;
	}
		
	return "ERRO";
}

function maskMoneyNeg(v) {
	v=v.replace(/^-,/,"-"); // Remove caso comece com virgula
	v=v.replace(/^-(\d+),(\d{2})(\d+)/,"-$1,$2"); //Somente duas casas decimais
	v=v.replace(/[^-\d,]/g,""); // Remove tudo que não é dígito ou vírgula
	v=v.replace(/-(\d{4})(\d+)/,"-$1"); //Numero de 4 digitos antes da virgula
	v=v.replace(/^-0+/g,"-");  // Remove zeros à esquerda
	
	v=v.replace(/^,/,""); // Remove caso comece com virgula
	v=v.replace(/^(\d+),(\d{2})(\d+)/,"$1,$2"); //Somente duas casas decimais
	v=v.replace(/(\d{4})(\d+)/,"$1"); //Numero de 4 digitos antes da virgula
	v=v.replace(/^0+/g,"");  // Remove zeros à esquerda

	return v;
}


	
